// 1. 顶级函数定义（带类型注解）
bool isNoble(int atomicNumber) {
  // 私有变量（下划线前缀表示库内私有）
  final Map<int, String> _nobleGases = {2: 'He', 10: 'Ne', 18: 'Ar'};
  return _nobleGases[atomicNumber] != null;
}

// 2. 箭头函数语法（单表达式简写）
bool isNobleShorthand(int atomicNumber) => _nobleGases[atomicNumber] != null;
// 共享私有变量
final Map<int, String> _nobleGases = {2: 'He', 10: 'Ne', 18: 'Ar'};

// 3. 命名参数函数
void enableFlags({
  bool? bold, // 可选命名参数（可空类型）
  bool hidden = false, // 带默认值的命名参数
  required String message, // 必填命名参数（required 关键字）
}) {
  print('bold: $bold, hidden: $hidden, message: $message');
}

// 4. 可选位置参数函数
String say(String from, String msg, [String? device]) {
  // 可选位置参数（方括号包裹）
  var result = '$from says "$msg"';
  if (device != null) result += ' with a $device';
  return result;
}

// 5. main 函数（程序入口）
void main(List<String> arguments) {
  // 命令行参数处理
  print('Arguments: ${arguments.join(', ')}');

  // 函数作为一等公民演示
  // 5.1 函数赋值给变量
  var greet = (String name) => 'Hello, $name!';
  print(greet('World')); // 输出: Hello, World!

  // 5.2 函数作为参数传递
  List<int> numbers = [1, 2, 3];
  numbers.forEach(printElement); // 输出每个元素

  // 5.3 匿名函数（闭包）
  var add = makeAdder(5);
  print('5 + 3 = ${add(3)}'); // 输出: 8

  // 6. 生成器函数演示
  // 6.1 同步生成器（sync* + yield）
  print('Synchronous generator:');
  for (int n in naturalsTo(5)) {
    print(n); // 输出: 0, 1, 2, 3, 4
  }

  // 6.2 异步生成器（async* + yield）
  runAsyncGenerator();

  // 7. 函数拆卸（Tear-offs）演示
  List<String> fruits = ['apple', 'banana', 'orange'];
  // 良好实践：使用函数拆卸
  fruits.forEach(print); // 直接传递函数引用

  // 不良实践：使用匿名函数
  // fruits.forEach((fruit) => print(fruit));
}

// 辅助函数：打印元素
void printElement(int element) {
  print('Element: $element');
}

// 闭包示例：返回加法函数
Function makeAdder(int addBy) {
  // 闭包捕获 addBy 变量
  return (int i) => addBy + i;
}

// 同步生成器函数（生成 0 到 n-1 的整数）
Iterable<int> naturalsTo(int n) sync* {
  int k = 0;
  while (k < n) yield k++; // yield 逐个返回值
}

// 异步生成器函数（演示异步流）
Future<void> runAsyncGenerator() async {
  print('Asynchronous generator:');
  await for (int n in asynchronousNaturalsTo(3)) {
    print(n); // 输出: 0, 1, 2（延迟 1 秒每个）
  }
}

// 异步生成器函数（带延迟）
Stream<int> asynchronousNaturalsTo(int n) async* {
  int k = 0;
  while (k < n) {
    yield k++;
    await Future.delayed(Duration(seconds: 1)); // 模拟异步操作
  }
}

// 测试函数相等性
class A {
  static void staticMethod() => print('Static method'); // 静态方法
  void instanceMethod() => print('Instance method'); // 实例方法
}

void testFunctionEquality() {
  // 比较顶级函数
  Function func1 = isNoble;
  assert(isNoble == func1, 'Top-level functions are equal');

  // 比较静态方法
  Function func2 = A.staticMethod;
  assert(A.staticMethod == func2, 'Static methods are equal');

  // 比较实例方法（不同实例不相等）
  var a1 = A();
  var a2 = A();
  assert(
    a1.instanceMethod != a2.instanceMethod,
    'Instance methods are different',
  );
}
